package ArrayList;

/**
 * @Author: dch
 * @Date: 2020/6/8 21:55
 * @Description:  自定义MyArrayList版本二
 */
public class MyArrayList2<E> {
    //定义数组，用于存放集合元素
    private Object[] elementData;
    //定义变量，用于记录数组的长度
    private int size;
    //定义空数组，用于在创建集合对象时给elementData初始化
    private Object[] emptyArray = {};
    //定义常量，用于记录集合的容量
    private final int DEFAULT_CAPACITY = 10;

    //构造方法
    public MyArrayList2(){
        //给elementData初始化
        elementData = emptyArray;
    }

    //定义add方法
    public boolean add(E e){
        //判断是否需要扩容
        grow();
        //将元素添加到集合
        elementData[size++] = e;
        return true;
    }

    //简单扩容
    private void grow(){
        //判断集合存储元素的数组是否等于emptyArray
        if(elementData == emptyArray){
            //第一次扩容
            elementData = new Object[DEFAULT_CAPACITY];
        }
        //核心算法：1.5倍
        //如果size==集合数组元素的长度，就需要扩容
        if(size == elementData.length){
            //先定义变量记录老容量
            int oldCapacity = elementData.length;
            //核心算法，1.5倍
            int newCapacity = oldCapacity + (oldCapacity >> 1);
            //创建一个新的数组，长度就是newCapatity
            Object[] objects = new Object[newCapacity];
            //拷贝元素
            System.arraycopy(elementData,0,objects,0,elementData.length);
            //把新数组的地址赋给elementData
            elementData = objects;
        }
    }

    public static void main(String[] args) {
        //测试
        MyArrayList2<String> myArrayList = new MyArrayList2();
        myArrayList.add("tutu");
        System.out.println(myArrayList.size);
    }
}
